home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 January / macformat-020.iso / Shareware City / Developers / OutOfPhase1.01Source / OutOfPhase Folder / 64BitMath.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-01  |  3.2 KB  |  107 lines  |  [TEXT/KAHL]

  1. /* 64BitMath.h */
  2.  
  3. #ifndef Included_64BitMath_h
  4. #define Included_64BitMath_h
  5.  
  6. /* 64BitMath module depends on */
  7. /* MiscInfo.h */
  8. /* Audit */
  9. /* Debug */
  10. /* Definitions */
  11.  
  12.  
  13. #if 0 /* || sizeof(long) == 8 */
  14.  
  15.  
  16. #if 1
  17.     /* this is the GNU stuff */
  18.     typedef long long int LongLongRec;
  19. #else
  20.     /* if sizeof(long) == 8 then you can enable this */
  21.     typedef long int LongLongRec;
  22. #endif
  23.  
  24. /* initialize a longlong with a double precision floating point value */
  25. #define Double2LongLong(dbl,lnglng) ((void)((lnglng)\
  26.                     = (LongLongRec)((dbl) * 4294967296.0L)))
  27.  
  28. /* convert a longlong to a double precision floating point value */
  29. #define LongLong2Double(lnglng) ((double)(lnglng) / 4294967296.0L)
  30.  
  31. /* get the low order unsigned 32 bits from the longlong */
  32. #define LongLongLowHalf(lnglng) ((unsigned long)((lnglng) & 0x00000000ffffffff))
  33.  
  34. /* get the high order signed 32 bits from the longlong */
  35. #define LongLongHighHalf(lnglng) ((signed long)((lnglng) >> 32))
  36.  
  37. /* mask the upper word */
  38. #define LongLongMaskHighHalf(lnglng,mask32) ((void)((lnglng) = ((((LongLongRec)(mask32))\
  39.                     << 32) | 0x00000000ffffffff) & (lnglng)))
  40.  
  41. /* store a new value into the upper word */
  42. #define LongLongSetHighHalf(lnglng,newhi) ((void)((lnglng) = (((LongLongRec)(newhi))\
  43.                     << 32) | ((lnglng) & 0x00000000ffffffff)))
  44.  
  45. /* add two longlongs:  *L = *L + *R */
  46. #define LongLongAdd(L,R) ((void)(*(L) = *(L) + *(R)))
  47.  
  48.  
  49. #else
  50.  
  51.  
  52. /* stuff for systems with only 32 bit ints */
  53.  
  54. /* set this to 1 to always use the generic add */
  55. #define FORCEGENERIC64BITADD (0)
  56.  
  57. /* this is publicly visible for speed */
  58. struct LongLongRec
  59.     {
  60.         unsigned long                Low32Bits;
  61.         signed long                    High32Bits;
  62.     };
  63.  
  64. typedef struct LongLongRec LongLongRec;
  65.  
  66. /* initialize a longlong with a double precision floating point value */
  67. #define Double2LongLong(dbl,lnglng) (void)((lnglng).High32Bits = (dbl),\
  68.                     (lnglng).Low32Bits = ((dbl) - ((lnglng).High32Bits)) * 4294967296.0L)
  69.  
  70. /* convert a longlong to a double precision floating point value */
  71. #define LongLong2Double(lnglng) ((lnglng).High32Bits\
  72.                     + (lnglng).Low32Bits / 4294967296.0L)
  73.  
  74. /* get the low order unsigned 32 bits from the longlong */
  75. #define LongLongLowHalf(lnglng) ((lnglng).Low32Bits)
  76.  
  77. /* get the high order signed 32 bits from the longlong */
  78. #define LongLongHighHalf(lnglng) ((lnglng).High32Bits)
  79.  
  80. /* mask the upper word */
  81. #define LongLongMaskHighHalf(lnglng,mask32) ((void)((lnglng).High32Bits &= (mask32)))
  82.  
  83. /* store a new value into the upper word */
  84. #define LongLongSetHighHalf(lnglng,newhi) ((void)((lnglng).High32Bits = (newhi)))
  85.  
  86. /* add two longlongs:  *L = *L + *R */
  87. #if ((PROC68020 == CURRENTPROCTYPE) || (PROC68000 == CURRENTPROCTYPE)) && defined(THINK_C) && !FORCEGENERIC64BITADD
  88.     /* 00000000: 2019               MOVE.L    (A1)+,D0 */
  89.     /* 00000002: D198               ADD.L     D0,(A0)+ */
  90.     /* 00000004: 2211               MOVE.L    (A1),D1 */
  91.     /* 00000006: 2010               MOVE.L    (A0),D0 */
  92.     /* 00000008: D181               ADDX.L    D1,D0 */
  93.     /* 0000000A: 2080               MOVE.L    D0,(A0) */
  94.     #pragma parameter LongLongAdd(__A0,__A1)
  95.     void                            LongLongAdd(LongLongRec* L, LongLongRec* R)
  96.         = {0x2019, 0xD198, 0x2211, 0x2010, 0xD181, 0x2080};
  97. #else
  98.     void                            LongLongAdd(LongLongRec* L, LongLongRec* R);
  99.     #define ENABLEGENERICLONGLONG
  100. #endif
  101.  
  102.  
  103. #endif
  104.  
  105.  
  106. #endif
  107.